04.Go Map
Table of Contents
Map
map 是一组无序的键值对的集合
map 是引用类型, 赋值时传递的是地址
map 初始化
map 只声明不初始化取零值 nil, nil map 只能读不能写入
map 初始化未添加值是 empty map, empty map 不等于 nil map
map[<key type>]<value type> // map 类型
var strMap = make(map[string]string, 1) // 声明并初始化一个 empty map, map 容量为 2
strMap["a"] = "a" // 已初始化的 map 赋值
strMap["b"] = "b"
intMap := map[string]int { // intMap 声明并初始化, 并赋值
"one": 1,
"two": 2,
}
Printf("int map %#v\n", intMap)
Printf("str map %#v\n", strMap)
Printf("str map length %v\n", len(strMap))
> int map map[string]int{"one":1, "two":2}
> str map map[string]string{"a":"a", "b":"b"} // map 可添加数据, 允许超过容量
> str map length 3 // 无法使用 cap 查看 map 容量, 可以使用 len 查看长度
map 传递
map 将引用拷贝了一份给赋值变量, 两个引用指向同一个数据
map 作为函数参数传递时也是拷贝一份引用进入函数
intMap := map[string]int {
"1st": 1,
}
copyMap := intMap // map 是引用类型, 传递的是引用并非数据的拷贝
copyMap["2nd"] = 2
intMap["1st"] = 4
Printf("intMap %#v\n", intMap)
Printf("copyMap %#v\n", copyMap)
> intMap map[string]int{"1st":4, "2nd":2} // 任意一个变量修改数据, 两个变量都会同步修改
> copyMap map[string]int{"1st":4, "2nd":2} // 两个变量指向同一个值, 结果一致
map 遍历
map 使用 range 遍历 map
map 值拷贝也需要使用 range 遍历, copy 只适用于切片
intMap := map[string]int {
"1st": 1,
"2nd": 2,
"3rd": 3,
}
copyMap := make(map[string]int, 3)
for key, value := range intMap {
copyMap[key] = value
Printf("%v: %v \n", key, value)
}
> 1st: 1
> 2nd: 2
> 3rd: 3
map 取值
map 使用 [key] 取值
intMap := map[string]int {
"1st": 1,
"2nd": 2,
}
value, ok := intMap["3rd"] // map 取值
if ok == true { // ok 为 true, valUe 为对应 key 的值
Printf("value: %v\n", value)
}
if ok == false { // ok 为 false, map 不存在 key, value 为类型零值
Printf("key not in map")
}
map 删除
intMap := map[string]int{
"1st": 1,
"2nd": 2,
}
delete(intMap, "1st")